using System;
using System.Linq;
using System.Text;
using DevExpress.Xpo;
using DevExpress.ExpressApp.Kpi;
using DevExpress.ExpressApp;
using System.ComponentModel;
using DevExpress.ExpressApp.DC;
using DevExpress.Data.Filtering;
using DevExpress.Persistent.Base;
using System.Collections.Generic;
using DevExpress.ExpressApp.Model;
using DevExpress.Persistent.BaseImpl;
using DevExpress.Persistent.Validation;
using DomainComponents.Common;
using DevExpress.ExpressApp.Xpo;
using DomainComponents.XCRM;
using DevExpress.Persistent.Base.General;
using DevExpress.ExpressApp.Security;

namespace XCRM.Module
{
    public class Updater : DevExpress.ExpressApp.Updating.ModuleUpdater
    {
        public const string AdministratorUserName = "Administrator";
        public Updater(IObjectSpace os, Version currentDBVersion)
            : base(os, currentDBVersion)
        {
        }
        public override void UpdateDatabaseAfterUpdateSchema()
        {
            base.UpdateDatabaseAfterUpdateSchema();

            return;


            IPersistentRole adminRole = ObjectSpace.FindObject<IPersistentRole>(new BinaryOperator("Name", "Administrators"));
            if (adminRole == null)
            {
                adminRole = ObjectSpace.CreateObject<IPersistentRole>();
                adminRole.Name = "Administrators";
            }
            if (adminRole.ObjectAccessPermissions.Count == 0)
            {
                adminRole.AddPermission(typeof(object), ObjectAccess.AllAccess);
                adminRole.CanEditModel = true;
            }
            if (ObjectSpace.FindObject<IMyAppUser>(new BinaryOperator("UserName", AdministratorUserName)) == null)
            {
                IMyAppUser administrator = ObjectSpace.CreateObject<IMyAppUser>();
                administrator.FirstName = AdministratorUserName;
                administrator.LastName = AdministratorUserName;
                ((IDCUser)administrator).UserName = AdministratorUserName;
                ((IPersistentComplexSecurityUser)administrator).IsActive = true;
                ((IPersistentComplexSecurityUser)administrator).Roles.Add(adminRole);
            }
#if EasyTest
			if(ObjectSpace.FindObject<IMyAppUser>(new BinaryOperator("UserName", "User1")) == null) {
                IMyAppUser user = ObjectSpace.CreateObject<IMyAppUser>();
                user.FirstName = "User1";
                user.LastName = "User1";
                ((IDCUser)user).UserName = "User1";
                ((IPersistentComplexSecurityUser)user).IsActive = true;
                ((IPersistentComplexSecurityUser)user).Roles.Add(adminRole);
            }
#endif
            ObjectSpace.CommitChanges();

            Session session = ((XPObjectSpace)ObjectSpace).Session;
            if (ObjectSpace.FindObject<ReportData>(new BinaryOperator("ReportName", "Leads By Lead Source")) == null)
            {
                ReportData report = new ReportData(session, typeof(ILead));
                System.IO.Stream resourceStream = GetType().Assembly.GetManifestResourceStream("XCRM.Module.EmbeddedReports.LeadsByLeadSourceReport.repx");
                byte[] content = new byte[resourceStream.Length];
                resourceStream.Read(content, 0, (int)resourceStream.Length);
                report.ReportName = "Leads By Lead Source";
                report.Content = content;
                ((IXtraReportData)report).DataType = typeof(ICRMLead);
                report.IsInplaceReport = true;
                ObjectSpace.CommitChanges();
            }
            if (ObjectSpace.FindObject<ReportData>(new BinaryOperator("ReportName", "Contact Details")) == null)
            {
                ReportData report = new ReportData(session, typeof(IContact));
                System.IO.Stream resourceStream = GetType().Assembly.GetManifestResourceStream("XCRM.Module.EmbeddedReports.Contact Details.repx");
                byte[] content = new byte[resourceStream.Length];
                resourceStream.Read(content, 0, (int)resourceStream.Length);
                report.ReportName = "Contact Details";
                report.Content = content;
                ((IXtraReportData)report).DataType = typeof(ICRMContact);
                report.IsInplaceReport = true;
                ObjectSpace.CommitChanges();
            }
            if (ObjectSpace.FindObject<ReportData>(new BinaryOperator("ReportName", "Active Invoices")) == null)
            {
                ReportData report = new ReportData(session, typeof(IInvoice));
                System.IO.Stream resourceStream = GetType().Assembly.GetManifestResourceStream("XCRM.Module.EmbeddedReports.Active Invoices.repx");
                byte[] content = new byte[resourceStream.Length];
                resourceStream.Read(content, 0, (int)resourceStream.Length);
                report.ReportName = "Active Invoices";
                report.Content = content;
                ((IXtraReportData)report).DataType = typeof(ICRMInvoice);
                report.IsInplaceReport = true;
                ObjectSpace.CommitChanges();
            }
            if (ObjectSpace.FindObject<ReportData>(new BinaryOperator("ReportName", "Sales History")) == null)
            {
                ReportData report = new ReportData(session, typeof(IOpportunity));
                System.IO.Stream resourceStream = GetType().Assembly.GetManifestResourceStream("XCRM.Module.EmbeddedReports.Sales History.repx");
                byte[] content = new byte[resourceStream.Length];
                resourceStream.Read(content, 0, (int)resourceStream.Length);
                report.ReportName = "Sales History";
                report.Content = content;
                ((IXtraReportData)report).DataType = typeof(ICRMOpportunity);
                report.IsInplaceReport = true;
                ObjectSpace.CommitChanges();
            }

            CreateKpiObjects();
        }
        private void CreateKpiObjects()
        {
            KpiScorecard obj2 = ObjectSpace.FindObject<KpiScorecard>(CriteriaOperator.Parse("Name='Sales'"));
            if (obj2 == null)
            {
                obj2 = ObjectSpace.CreateObject<KpiScorecard>();
                obj2.Name = "Sales";
                obj2.Save();
            }
            KpiDefinition obj1 = ObjectSpace.FindObject<KpiDefinition>(CriteriaOperator.Parse("Name='New Leads'"));
            if (obj1 == null)
            {
                obj1 = ObjectSpace.CreateObject<KpiDefinition>();
                obj1.Name = "New Leads";
                obj1.TargetObjectType = typeof(ILead);
                obj1.Criteria = "CreatedOn >= '@RangeStart' And CreatedOn <= '@RangeEnd'";
                obj1.Expression = "Count";
                obj1.Range = DateRangeRepository.FindRange("ThisMonthToDate");
                obj1.Compare = true;
                obj1.RangeToCompare = DateRangeRepository.FindRange("LastMonthToDate");
                obj1.MeasurementFrequency = TimeIntervalType.Day;
                obj1.Save();
                obj2.Indicators.Add(obj1.KpiInstance);
            }
            KpiDefinition obj11 = ObjectSpace.FindObject<KpiDefinition>(CriteriaOperator.Parse("Name='New Opportunities'"));
            if (obj11 == null)
            {
                obj11 = ObjectSpace.CreateObject<KpiDefinition>();
                obj11.Name = "New Opportunities";
                obj11.TargetObjectType = typeof(IOpportunity);
                obj11.Criteria = "CreatedOn >= '@RangeStart' And CreatedOn <= '@RangeEnd'";
                obj11.Expression = "Count";
                obj11.Range = DateRangeRepository.FindRange("ThisMonthToDate");
                obj11.Compare = true;
                obj11.RangeToCompare = DateRangeRepository.FindRange("LastMonthToDate");
                obj11.MeasurementFrequency = TimeIntervalType.Day;
                obj11.Save();
                obj2.Indicators.Add(obj11.KpiInstance);
            }
            KpiDefinition obj12 = ObjectSpace.FindObject<KpiDefinition>(CriteriaOperator.Parse("Name='New Quotes'"));
            if (obj12 == null)
            {
                obj12 = ObjectSpace.CreateObject<KpiDefinition>();
                obj12.Name = "New Quotes";
                obj12.TargetObjectType = typeof(IQuote);
                obj12.Criteria = "CreatedOn >= '@RangeStart' And CreatedOn <= '@RangeEnd'";
                obj12.Expression = "Count";
                obj12.Range = DateRangeRepository.FindRange("ThisMonthToDate");
                obj12.Compare = true;
                obj12.RangeToCompare = DateRangeRepository.FindRange("LastMonthToDate");
                obj12.MeasurementFrequency = TimeIntervalType.Day;
                obj12.Save();
                obj2.Indicators.Add(obj12.KpiInstance);
            }
            KpiDefinition obj13 = ObjectSpace.FindObject<KpiDefinition>(CriteriaOperator.Parse("Name='New Orders'"));
            if (obj13 == null)
            {
                obj13 = ObjectSpace.CreateObject<KpiDefinition>();
                obj13.Name = "New Orders";
                obj13.TargetObjectType = typeof(IOrder);
                obj13.Criteria = "CreatedOn >= '@RangeStart' And CreatedOn <= '@RangeEnd'";
                obj13.Expression = "Count";
                obj13.Range = DateRangeRepository.FindRange("ThisMonthToDate");
                obj13.Compare = true;
                obj13.RangeToCompare = DateRangeRepository.FindRange("LastMonthToDate");
                obj13.MeasurementFrequency = TimeIntervalType.Day;
                obj13.Save();
                obj2.Indicators.Add(obj13.KpiInstance);
            }
            KpiDefinition obj14 = ObjectSpace.FindObject<KpiDefinition>(CriteriaOperator.Parse("Name='New Invoices'"));
            if (obj14 == null)
            {
                obj14 = ObjectSpace.CreateObject<KpiDefinition>();
                obj14.Name = "New Invoices";
                obj14.TargetObjectType = typeof(IInvoice);
                obj14.Criteria = "CreatedOn >= '@RangeStart' And CreatedOn <= '@RangeEnd'";
                obj14.Expression = "Count";
                obj14.Range = DateRangeRepository.FindRange("ThisMonthToDate");
                obj14.Compare = true;
                obj14.RangeToCompare = DateRangeRepository.FindRange("LastMonthToDate");
                obj14.MeasurementFrequency = TimeIntervalType.Day;
                obj14.Save();
                obj2.Indicators.Add(obj14.KpiInstance);
            }
            ObjectSpace.CommitChanges();
        }
    }



    //[DefaultClassOptions]
    ////[ImageName("BO_Contact")]
    ////[DefaultProperty("DisplayMemberNameForLookupEditorsOfThisType")]
    ////[DefaultListViewOptions(MasterDetailMode.ListViewOnly, false, NewItemRowPosition.None)]
    ////[Persistent("DatabaseTableName")]
    //// Specify more UI options using a declarative approach (http://documentation.devexpress.com/#Xaf/CustomDocument2701).
    //public class Updater : BaseObject
    //{ // Inherit from a different class to provide a custom primary key, concurrency and deletion behavior, etc. (http://documentation.devexpress.com/#Xaf/CustomDocument3146).
    //    public Updater(Session session)
    //        : base(session)
    //    {
    //    }
    //    public override void AfterConstruction()
    //    {
    //        base.AfterConstruction();
    //        // Place your initialization code here (http://documentation.devexpress.com/#Xaf/CustomDocument2834).
    //    }
    //    //private string _PersistentProperty;
    //    //[XafDisplayName("My display name"), ToolTip("My hint message")]
    //    //[ModelDefault("EditMask", "(000)-00"), Index(0), VisibleInListView(false)]
    //    //[Persistent("DatabaseColumnName"), RuleRequiredField(DefaultContexts.Save)]
    //    //public string PersistentProperty {
    //    //    get { return _PersistentProperty; }
    //    //    set { SetPropertyValue("PersistentProperty", ref _PersistentProperty, value); }
    //    //}

    //    //[Action(Caption = "My UI Action", ConfirmationMessage = "Are you sure?", ImageName = "Attention", AutoCommit = true)]
    //    //public void ActionMethod() {
    //    //    // Trigger a custom business logic for the current record in the UI (http://documentation.devexpress.com/#Xaf/CustomDocument2619).
    //    //    this.PersistentProperty = "Paid";
    //    //}
    //}
}
